home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / util / cli / FSort12.lha / FSort.asm < prev    next >
Assembly Source File  |  1995-01-16  |  3KB  |  234 lines

  1. ; File Sorting Utility 1.2
  2. ; (c) 1995 MJSoft System Software, Martin Mares
  3.  
  4. ;DEBUG    set    1
  5. _GlobVec    set    1
  6. SYSI    equ    1
  7.  
  8.     include    "ssmac.h"
  9.  
  10. QUANTLOG    equ    13
  11. QUANTUM    equ    1<<QUANTLOG
  12.  
  13.     clistart
  14.  
  15.     get.l    stdin,d7
  16.     dt    siname,<STDIN>
  17.     tpea    siname
  18.     get.l    ffrom,d1
  19.     beq.s    ReadInit
  20.     move.l    d1,a0
  21.     move.l    a0,(sp)
  22.     moveq    #OPEN_OLD,d0
  23.     call    TrackOpen
  24.     move.l    d0,d7
  25.     put.l    d1,srctrk
  26.     dv.l    srctrk
  27. ReadInit    moveq    #0,d6
  28.     moveq    #0,d5        ; Pointer to first block
  29.     moveq    #10,d4
  30.  
  31.     moveq    #64,d0
  32.     lsl.l    #QUANTLOG-6,d0
  33.     get.l    buffer,d1
  34.     beq.s    HaveBSize
  35.     move.l    d1,a0
  36.     move.l    (a0),d0
  37.     dtl    <Invalid buffer size>,a0
  38.     cmp.l    #256,d0
  39.     bcs.s    ExitErr
  40. HaveBSize    put.l    d0,buffer
  41.  
  42. ReadIn    get.l    buffer,d0
  43.     move.l    d0,d3
  44.     call    TrackAllocPub
  45.     move.l    d0,a3
  46.     add.l    d0,d3
  47.     move.l    d5,(a3)
  48.     move.l    a3,d5
  49.     addq.l    #6,a3
  50.     move.l    a3,a4
  51.     bra.s    CPL
  52. CPL1    move.b    (a2)+,(a3)+
  53. CPL    dbf    d6,CPL1
  54.     move.l    d7,d1
  55.     move.l    a3,d2
  56.     sub.l    d2,d3
  57.     call    TestBreak
  58.     call    dos,Read
  59.     move.l    (v),a6
  60.     add.l    d0,a3
  61.     move.l    a3,d1
  62.     sub.l    a4,d1
  63.     move.w    d1,-(a4)
  64.     tst.l    d0
  65.     ble.s    EndOrErr
  66.     move.l    a3,d6
  67.     subq.w    #1,d0
  68. RIFindEOL    cmp.b    -(a3),d4
  69.     dbeq    d0,RIFindEOL
  70.     beq.s    RIFoundEOL
  71.     dtl    <Line too long>,a0
  72. ExitErr    jump    ExitError
  73.  
  74. RIFoundEOL    addq.l    #1,a3
  75.     sub.l    a3,d6
  76.     sub.w    d6,(a4)
  77.     move.l    a3,a2
  78.     bra.s    ReadIn
  79.  
  80. EndOrErr    beq.s    PrepareIndex
  81.     moveq    #err_read,d0
  82. reperrsp    move.l    (sp),a1
  83.     jump    ss,ReportError
  84.  
  85. PrepareIndex    tst.w    (a4)
  86.     beq.s    LastLineOK
  87.     cmp.b    -1(a3),d4
  88.     beq.s    LastLineOK
  89.     move.b    d4,(a3)
  90.     addq.w    #1,(a4)
  91.  
  92. LastLineOK    move.l    d5,a0
  93.     moveq    #0,d0
  94. .pi    move.l    (a0)+,d1
  95.     move.w    (a0)+,d2
  96.     beq.s    .nx
  97.     subq.w    #1,d2
  98. .loop    cmp.b    (a0)+,d4
  99. .next    dbeq    d2,.loop
  100.     bne.s    .nx
  101.     addq.l    #1,d0
  102.     dbf    d2,.loop
  103. .nx    move.l    d1,a0
  104.     tst.l    d1
  105.     bne.s    .pi
  106.  
  107.     move.l    d0,d6
  108.     lsl.l    #2,d0
  109.     moveq    #64,d2
  110.     lsl.l    #4,d2
  111.     add.l    d2,d0
  112.     call    TrackAllocPub
  113.     move.l    d0,a4        ; A4=buf start
  114.     move.l    d0,a1
  115.     add.l    d2,a1
  116.     move.l    a1,a3        ; A3=buf limit
  117.     move.l    d5,a0
  118. .idx    move.l    (a0)+,d1
  119.     move.w    (a0)+,d2
  120.     beq.s    .nxx
  121.     subq.w    #1,d2
  122. .lin    move.l    a0,(a1)+
  123. .chr    cmp.b    (a0)+,d4
  124.     dbeq    d2,.chr
  125.     bne.s    .nxx
  126.     sf    -1(a0)
  127.     dbf    d2,.lin
  128. .nxx    move.l    d1,a0
  129.     tst.l    d1
  130.     bne.s    .idx
  131.  
  132.     move.l    d6,d0
  133.     move.l    a3,a0
  134.     lea    cmpf(pc),a1
  135.     tsv.l    case
  136.     beq.s    go1
  137.     lea    cmpfcase(pc),a1
  138. go1    moveq    #4,d1
  139.     call    QuickSort
  140.  
  141.     get.l    srctrk,a0
  142.     call    FreeObject
  143.     get.l    stdout,d7
  144.     dt    soname,<STDOUT>
  145.     tpea    soname
  146.     get.l    fto,d1
  147.     beq.s    wrt1
  148.     move.l    d1,a0
  149.     moveq    #OPEN_NEW,d0
  150.     move.l    a0,(sp)
  151.     call    TrackOpen
  152.     move.l    d0,d7
  153. wrt1    move.l    a4,a2        ; A2=buf current
  154.     subq.l    #1,d6
  155.     bmi.s    done
  156.     move.l    d6,d5
  157.     swap    d5
  158. wrt2    move.l    (a3)+,a0
  159. wrt3    cmp.l    a2,a3
  160.     bne.s    wrt4
  161.     push    a0
  162.     bsr.s    flushbuf
  163.     pop    a0
  164. wrt4    move.b    (a0)+,(a2)+
  165.     bne.s    wrt3
  166.     move.b    d4,-1(a2)
  167.     dbf    d6,wrt2
  168.     dbf    d5,wrt2
  169.  
  170. done    bsr.s    flushbuf
  171.     addq.l    #8,sp
  172.     rts
  173.  
  174. flushbuf    move.l    d7,d1
  175.     move.l    a4,d2
  176.     move.l    a2,d3
  177.     sub.l    d2,d3
  178.     beq.s    flubu1
  179.     call    ss,TestBreak
  180.     call    dos,Write
  181.     cmp.l    d0,d3
  182.     bne.s    wrterr
  183. flubu1    move.l    a4,a2
  184.     rts
  185.  
  186. wrterr    moveq    #err_write,d0
  187.     bra    reperrsp
  188.  
  189. cmpfcase    move.l    (a0),a0
  190.     move.l    (a1),a1
  191. caseloop    move.b    (a0)+,d0
  192.     beq.s    caseend
  193.     cmp.b    (a1)+,d0
  194.     beq.s    caseloop
  195.     bcs.s    bgta
  196. agtb    moveq    #1,d0
  197.     rts
  198. bgta    moveq    #-1,d0
  199.     rts
  200. caseend    tst.b    (a1)
  201.     bne.s    bgta
  202.     moveq    #0,d0
  203.     rts
  204.  
  205. cmpf    move.l    (a0),a0
  206.     move.l    (a1),a1
  207. cfloop    move.b    (a0)+,d0
  208.     beq.s    caseend
  209.     move.b    (a1)+,d1
  210.     cmp.b    #'a',d0
  211.     bcs.s    1$
  212.     cmp.b    #'z'+1,d0
  213.     bcc.s    1$
  214.     sub.b    #32,d0
  215. 1$    cmp.b    #'a',d1
  216.     bcs.s    2$
  217.     cmp.b    #'z'+1,d1
  218.     bcc.s    2$
  219.     sub.b    #32,d1
  220. 2$    cmp.b    d1,d0
  221.     beq.s    cfloop
  222.     bcs.s    bgta
  223.     bra.s    agtb
  224.  
  225.     dt    <$VER: FSort 1.2 (16.1.95) © 1995 MJSoft System Software>
  226.     tags
  227.     template    <FROM,TO,CASE/S,BUF/N/K>
  228.     dv.l    ffrom
  229.     dv.l    fto
  230.     dv.l    case
  231.     dv.l    buffer
  232.     finish
  233.     end
  234.